home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xarchie-2.0.9 / weight.c < prev    next >
C/C++ Source or Header  |  1995-06-18  |  6KB  |  243 lines

  1. /*
  2.  * weight.c : Routines for ordering hosts by "weight"
  3.  *
  4.  * George Ferguson, ferguson@cs.rochester.edu, 23 Apr 1993.
  5.  * Based on a suggestion from Peter J Nilsson (pjn@ida.liu.se).
  6.  * 13 May 1993: Add "org" to US weights and make sure others have proper
  7.  *        US lists.
  8.  *  7 Jun 1993: Added weights for Norway, from janl@ifi.uio.no.
  9.  * 30 Jun 1993: Added weights for France, from Hugues.Leroy@irisa.fr
  10.  *              Added weights for Germany, Volker.Zink@inf-wiss.uni-konstanz.de
  11.  * 27 Jul 1993: Added weights for Israel, from amoss@cs.huji.ac.il
  12.  */
  13.  
  14. #include <stdio.h>
  15. #include "sysdefs.h"
  16. #include "stringdefs.h"
  17. #include "xtypes.h"
  18. #include "appres.h"
  19. #include "weight.h"
  20. #include "hostname.h"
  21. #include "debug.h"
  22.  
  23. #define Number(arr) (sizeof(arr) / sizeof(arr[0]))
  24.  
  25. #define ISSPACE(C) ((C) == ' ' || (C) == '\t' || (C) == '\n')
  26. #define ISDIGIT(C) ((C) >= '0' && (C) <= '9')
  27.  
  28. #define UNKNOWN_WEIGHT 99
  29.  
  30. /*
  31.  * Functions defined here:
  32.  */
  33. void initHostWeights(),reinitHostWeights();
  34. int hostWeight();
  35.  
  36. static int parseHostWeights();
  37.  
  38. /*
  39.  * Data defined here:
  40.  */
  41. static HostWeightRec *hostWeightList;
  42. static int hostWeightListLen;
  43.  
  44. /*
  45.  * These weight lists are used if the hostWeights resource isn't given.
  46.  * We attempt to determine a useful one by looking at the last component
  47.  * of the hostname, if there is one.
  48.  * The formatting is ugly so we don't have extra spaces on the Settings
  49.  * panel.
  50.  */
  51. static struct _HostWeightDefault {
  52.     char *domain;
  53.     char *weights;
  54. } defaults[] = {
  55.     /* North America, from gf (also used as default) */
  56.     { "us", "1   edu com net gov mil us org\n\
  57. 2   ca\n\
  58. 3   uk de nl fi fr eu.net\n\
  59. 100 au nz jp" },
  60. /* For Sweden, from Peter J Nilsson (pjn@ida.liu.se) */
  61.     { "se", "1   se\n\
  62. 2   fi dk no\n\
  63. 10  eu.net nl fr de\n\
  64. 20  edu com gov net mil us org\n\
  65. 100 au nz jp" },
  66. /* For Norway, from gf (based on se) */
  67.     { "no", "1   no\n\
  68. 2   fi dk se\n\
  69. 10  eu.net nl fr de\n\
  70. 20  edu com gov net mil us org\n\
  71. 100 au nz jp" },
  72. /* For Finland, from gf (based on se) */
  73.     { "fi", "1   si\n\
  74. 2   se dk no\n\
  75. 10  eu.net nl fr de\n\
  76. 20  edu com gov net mil us org\n\
  77. 100 au nz jp" },
  78. /* For the UK, from gf */
  79.     { "uk", "1   uk\n\
  80. 2   se fi dk no nl fr de eu.net\n\
  81. 20  edu com gov net mil us org\n\
  82. 100 au nz jp" },
  83. /* For New Zealand, from Andy.Linton@comp.vuw.ac.nz */
  84.     { "nz", "1   nz\n\
  85. 10  edu com gov net mil us org jp\n\
  86. 20  se fi dk no nl fr de eu.net uk au" },
  87. /* For Australia, from gf (based on nz) */
  88.     { "au", "1   au\n\
  89. 10  edu com gov net mil us org jp\n\
  90. 20  se fi dk no nl fr de eu.net uk nz" },
  91. /* For Japan, from gf (a total guess) */
  92.     { "jp", "1   jp\n\
  93. 10  edu com gov net mil us org\n\
  94. 20  au nz\
  95. 30  se fi dk no nl fr de eu.net uk" },
  96. /* For Norway, from janl@ifi.uio.no */
  97.     { "no", "1   no\n\
  98. 2   fi dk se\n\
  99. 10  eu.net nl fr\n\
  100. 20  edu com gov net de\n\
  101. 100 au nz jp" },
  102. /* For France, from Hugues.Leroy@irisa.fr */
  103.     { "fr", "1   fr\n\
  104. 2   se fi dk no nl uk de eu.net\n\
  105. 20  edu com gov net mil us org\n\
  106. 100 au nz jp" },
  107. /* For Germany, from Volker.Zink@inf-wiss.uni-konstanz.de, modified with
  108.    comments from liebe@hrz.th-darmstadt.de. */
  109.     { "de", "1   de\n\
  110. 2   ch uk dk nl fr eu.net\n\
  111. 10  se fi no\n\
  112. 20  edu com gov net mil us\n\
  113. 100 au nz jp" },
  114. /* For Israel, from amoss@cs.huji.ac.il */
  115.     { "il", "1  il\n\
  116. 2   ch it\n\
  117. 10  uk dk nl fr fi se no eu.net\n\
  118. 20  de cs es\n\
  119. 50  edu com gov net mil us ca\n\
  120. 100 au nz jp" },
  121. };
  122.  
  123.  
  124. /*    -    -    -    -    -    -    -    -    */
  125. void
  126. initHostWeights()
  127. {
  128.     char *hostname,*dot;
  129.     int i,found;
  130.  
  131.     if (appResources.hostWeights == NULL) {
  132.     found = 0;    /* default if none matches */
  133.     hostname = GetHostname();
  134.     if ((dot=rindex(hostname,'.')) != NULL) {
  135.         dot += 1;
  136.         for (i=0; i < Number(defaults); i++) {
  137.         if (strcasecmp(dot,defaults[i].domain) == 0) {
  138.             found = i;
  139.             break;
  140.         }
  141.         }
  142.     }
  143.     appResources.hostWeights = XtNewString(defaults[found].weights);
  144.     }
  145.     reinitHostWeights();
  146. }
  147.  
  148.  
  149. /*
  150.  * This function is called whenever the weight list changes, eg, on
  151.  * the Settings panel as well as at startup.
  152.  */
  153.  
  154. void
  155. reinitHostWeights()
  156. {
  157.     /* Count how many entries there are */
  158.     hostWeightListLen = parseHostWeights(appResources.hostWeights,0);
  159.     /* Allocate the array to store them */
  160.     if (hostWeightList != NULL)
  161.     free((char*)hostWeightList);
  162.     hostWeightList = (HostWeightRec *)calloc(hostWeightListLen,
  163.                          sizeof(HostWeightRec));
  164.     /* Rescan and parse for real */
  165.     (void)parseHostWeights(appResources.hostWeights,1);
  166. }
  167.  
  168. /*
  169.  * Classes are of the form "[weight] host [host] [host] {,\n\0}"
  170.  */
  171.  
  172. /* Each class of hosts is separated by this: */
  173. #define ISCLASSSEP(C)    ((C) == ',' || (C) == '\n')
  174. /* Within classes, each host is separated by this: */
  175. #define ISHOSTSEP(C)    ISSPACE(C)
  176.  
  177. static int
  178. parseHostWeights(s,saveit)
  179. char *s;
  180. int saveit;
  181. {
  182.     char buf[256];
  183.     int i,n,weight;
  184.  
  185.     n = 0;
  186.     weight = 0;
  187.     while (*s) {
  188.     /* Skip spaces and empty classes */
  189.     while (ISSPACE(*s) || ISCLASSSEP(*s))
  190.         s += 1;
  191.     /* Get the weight, if given */
  192.     i = 0;
  193.     while (ISDIGIT(*s))
  194.         buf[i++] = *s++;
  195.     buf[i] = '\0';
  196.     if (saveit && i > 0) {
  197.         weight = atoi(buf);
  198.     }
  199.     /* Get the hosts in the class */
  200.     while (*s && !ISCLASSSEP(*s)) {
  201.         /* Skip spaces, if any */
  202.         while (ISSPACE(*s) || ISHOSTSEP(*s))
  203.         s += 1;
  204.         /* Get the host string */
  205.         i = 0;
  206.         while (*s && !ISHOSTSEP(*s) && !ISCLASSSEP(*s))
  207.         buf[i++] = *s++;
  208.         buf[i] = '\0';
  209.         /* Save this host */
  210.         if (saveit && i > 0) {
  211.         XtFree(hostWeightList[n].name);
  212.         hostWeightList[n].name = XtMalloc(strlen(buf)+1);
  213.         strcpy(hostWeightList[n].name,buf);
  214.         hostWeightList[n].weight = weight;
  215.         DEBUG2("Set weight of \"%s\" = %d\n",buf,weight);
  216.         }
  217.         /* Keep track of how many */
  218.         n += 1;
  219.     }
  220.     }
  221.     /* Return total hosts */
  222.     return(n);
  223. }
  224.  
  225. int
  226. hostWeight(host)
  227. char *host;
  228. {
  229.     int i,offs,hostlen;
  230.  
  231.     hostlen = strlen(host);
  232.     for (i=0; i < hostWeightListLen; i++) {
  233.     if ((offs=hostlen-strlen(hostWeightList[i].name)) < 0)
  234.         offs = 0;
  235.     if (!strcasecmp(host+offs,hostWeightList[i].name)) {
  236.         DEBUG3("Weight of \"%s\" (\"%s\") = %d\n",
  237.            host,host+offs,hostWeightList[i].weight);
  238.         return(hostWeightList[i].weight);
  239.     }
  240.     }
  241.     return(UNKNOWN_WEIGHT);
  242. }
  243.